﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _01dataGridView渲染问题
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += Form_loader;
        }
        private List<Student> stus;
        private void Form_loader(object sender, EventArgs e)
        {
            stus = new List<Student>();
            for (int i = 0; i < 10; i++)
            {

                Student st = new Student()
                {
                    StudentName = "张三" + i,
                    Age = 20 + i,
                };
                stus.Add(st);
            }
            // 数据绑定请请开给你
            // 1: 默认自动渲染列表。1：列明=Student属性明  2：列数量=Student属性的个数
            //dataGridView1.DataSource = stus;


            // 2: 自动渲染，没有的类不渲染了
            //  2.1 在设计器中，添加列，并的绑定数据。
            //  2.2 代码方式添加列
            //dataGridView1.AutoGenerateColumns = false;
            //dataGridView1.DataSource = stus;

            // 3:代码方式设置列

            // 3.1 将设计器中所设置的所有信息全部清空
            dataGridView1.Columns.Clear();

            // 3.2 代码方式添加列标题
            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn()
            {
                Name = "StudentName",
                //CellType = ,
                HeaderText = "姓名",
                Width = 200,
                DataPropertyName = "StudentName"
            });


            dataGridView1.Columns.Add(new DataGridViewTextBoxColumn()
            {
                Name = "Age",
                HeaderText = "年龄",
                Width = 300,
                DataPropertyName = "Age"
            });
            dataGridView1.Columns.Add(new DataGridViewButtonColumn()
            {
                Name = "control",
                HeaderText = "操作",
                UseColumnTextForButtonValue = true,
                Text = "删除",

            });

            // 3.3 绑定数据
            dataGridView1.AutoGenerateColumns = false;

            dataGridView1.DataSource = stus;
            // bug: 显示效果;超出了设置列的范围. 因为默认情况;渲染 Stus中实例 Student 所有属性
            // 解决：１：修改Student  使 Studnet 属性数= 列数量.
            //       2:  不修改Student ,设置 表格dataGridView1.AutoGenerateColumns = false;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            stus.Sort(new StuAgeDesc());
            //dataGridView1.DataSource = stus;

            // 当dataGridView1 的 DataSource 绑定的数据发生变化时, 重新绘制表格
            dataGridView1.Refresh();
        }

        private void button2_Click(object sender, EventArgs e)
        {

            //  ColumnHeadersDefaultCellStyle  列头单元格样式
            //  RowsDefaultCellStyle   行默认单元格样式
            //  GridColor 网格默认背景颜色
            //  AlternatingRowsDefaultCellStyle 奇数行默认样式
            //  CellBorderStyle 单元格边框样式
            //  ColumnHeadersBorderStyle 列头边框样式
            //  RowHeadersBorderStyle   行头默认边框样式
            //  DefaultCellStyle 默认单元格样式
            //  BackgroundColor 未显示数据的背景颜色
            //  RowsDefaultCellStyle.BackColo 显示数据时的背景色
            //  EnableHeadersVisualStyles   是否禁止当前默认的视觉样式
            //  ColumnHeadersHeight        列标题的宽度;
            /// 样式一
            /// 


            ///
            /// 样式二 列头样式
            /// 
            dataGridView1.EnableHeadersVisualStyles = false;
            dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = Color.White;

            //dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.Blue;
            // 红绿蓝颜色范围:0-255
            dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(193 ,255, 193) ;

            dataGridView1.ColumnHeadersDefaultCellStyle.Font = new Font("楷体", 18F);

            // 注意:默认高度自动调整,想要有效;需要设置这个
            dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
            dataGridView1.ColumnHeadersHeight = 200;

            // 摘要:
            //  Custom   进行了自定义边框。
            //
            // 摘要:
            //   Single  单线边框。
            //
            // 摘要:
            //   Raised  三维凸起的边框。
            //
            // 摘要:
            //   Sunken     三维凹陷边框。
            //
            // 摘要:
            //  None   无边框。
            dataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;

            /// 网格样式
            /// 
            dataGridView1.BackgroundColor = Color.Orange;

            ///
            /// 行样式 -- 斑马样式
            /// 
            dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Yellow;
            dataGridView1.AlternatingRowsDefaultCellStyle.ForeColor = Color.Red;
            dataGridView1.RowsDefaultCellStyle.BackColor = Color.Blue;

            ///  
            /// 设置行头样式
            ///  
            dataGridView1.RowHeadersDefaultCellStyle.BackColor = Color.Red;
            dataGridView1.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
            dataGridView1.RowHeadersWidth = 30;

            ///  选中行样式
            ///  
            dataGridView1.RowHeadersDefaultCellStyle.SelectionBackColor = Color.Orange; // 选中行头样式
            dataGridView1.RowsDefaultCellStyle.SelectionBackColor = Color.Green;   // 选中行的样式

        }

        private void button3_Click(object sender, EventArgs e)
        {
            // CurrentRow 当前选中的行
            // Cells      选中行的单元格集合
            // Cells["Name"]  获取具体某个单元格实例
            // CurrentRow.Cells["StudentName"].Value  获取选中行中单元格中的值.;

            MessageBox.Show(dataGridView1.CurrentRow.Cells["StudentName"].Value.ToString()); 
        }
    }

    class StuAgeDesc : IComparer<Student>
    {
        public int Compare(Student pre, Student next)
        {
            return -pre.Age.CompareTo(next.Age);
        }
    }


    class Student
    {
        private int studentId;
        public int StudentId
        {
            get { return studentId; }
            set { studentId = value; }
        }

        private string studentName;
        public string StudentName
        {
            get { return studentName; }
            set { studentName = value; }
        }

        private DateTime birthday;
        public DateTime Birthday
        {
            get { return birthday; }
            set { birthday = value; }
        }

        private string gender;
        public string Gender
        {
            get { return gender; }
            set { gender = value; }
        }

        public string StudentIdNo { get; set; }
        public int Age { get; set; }
        public string StuImage { get; set; }
        public string PhoneNumber { get; set; }
        public string StudentAddress { get; set; }
        public string CardNo { get; set; }
        public int ClassId { get; set; }

        public string ClassName { get; set; }

    }
}
